package awdc;

import java.util.regex.*;

class NickList {
	Nick First;
	Nick Last;

	//Конструктор
	NickList(){
		First = null;
		Last = null;
	}
	
	/*  Маленький комментарий
	  * Конструктор используется в методе хаба логин, получает информацию в первый раз
	  * Следующий же метод используется в методе комворкера, заменяя первый ник на ник откуда-то и дописывающий все остальные ники
	*/

	//Констуктор, создающий никлист по полученному никлисту в виде строки
	NickList(String LongNicksString){
		int flag=0;
		Pattern P = Pattern.compile("[^\\$]\\$\\$(.*)");
		while(flag==0){
			Matcher m = P.matcher(LongNicksString);
			if (m.matches())
				addNick(m.group(1));
			else 
				flag=1;
		}
	}
	//Метод, заменяющий уже существующий никлист на новый
	void setNicks(String LongNicksString){
		int flag=0;
		int first=1;
		Pattern P = Pattern.compile("[^\\$]\\$\\$(.*)");
		while(flag==0){
			Matcher m = P.matcher(LongNicksString);
			if (m.matches()){
				if (first==1) {
					First.setNickName(m.group(1));
					Last = First;
					First.setNext(null);
					first = 0;
				} else 
				addNick(m.group(1));
			} else
				flag =1;
		}
	}
	//Метод, выводящий на экран все ники
	void showNicks(){
		Nick Temp = First;
		while (Temp!=null){
			System.out.print(Temp.getNickName() + " ");
			Temp = Temp.Next;
		}
		System.out.print("\n");
	}
	//Метод для добавления ника к списку
	void addNick(String NickName){
		if (this.First == null){
			First = new Nick(NickName);
			Last = First;
		} else {
			Nick Temp;
			Temp = First;
			while (Temp.getNext() != Last && !(Temp.getNickName().equals(NickName)))
				Temp = Temp.getNext();
			if (Temp == Last) {
				Temp.setNext(new Nick(NickName));
				Last = Temp.getNext();
			} 
		}
	}

	//Метод для удаления ника из списка
	void dropNick(String NickName){
		Nick Temp=First;
		Nick Hlp=null;
		if (First != null) {
			while(Temp.getNext() != Last &&!(Temp.getNickName().equals(NickName))){
				Hlp = Temp;
				Temp = Temp.getNext();
			}
			if (Temp==Last && (Temp.getNickName().equals(NickName))){ //Если надо удалить последний ник
				Last = Hlp;
				Last.setNext(null);
			} else if (Temp != Last){ //Если ник, который надо удалить где-то посреди списка или первый
				if (Temp != First)//Если посреди
					Hlp.setNext(Temp.getNext());
				else				//если первый
					First=First.getNext();
			}
		}
	}

}

class Nick{
	String NickName;
	String Address;
	Nick Next;
	
	//Метод, возвращающий указатель на следующий ник
	Nick getNext(){
		return this.Next;
	}
	//Метод, возвращающий ник
	String getNickName(){
		return this.NickName;
	}

	//Метод для создания на месте указателя Next нового ника
	void setNext(Nick NewNick){
		this.Next = NewNick;
	}
	void setNickName(String NewNick){
		this.NickName = NewNick;
	}
	//Конструктор
	Nick(String NickName){
		this.NickName = NickName;
	}


}
